package Servidor;

//Hilo encargado de atender a un cliente
import java.io.*;
import java.net.Socket;

import javax.swing.DefaultListModel;
import javax.swing.event.ListDataEvent;
import javax.swing.event.ListDataListener;

public class HiloDeCliente implements Runnable, ListDataListener{
	/* VARIABLES */
	private DefaultListModel<String> charla;
	private Socket socket;
	private DataInputStream dataInput;
	private DataOutputStream dataOutput;
	/* VARIABLES */
	
	/* CONSTRUCTOR */
	public HiloDeCliente ( DefaultListModel<String> charla, Socket socket)
	{
		this.charla = charla;
		this.setSocket(socket);
		try
		{
			dataInput = new DataInputStream( socket.getInputStream());
			dataOutput = new DataOutputStream( socket.getOutputStream());
			charla.addListDataListener(this);
		}//Fin del bloque try

		//Procesar problemas con E/S
		catch ( IOException excepcionES ) {
			excepcionES.printStackTrace();
		}
	}//Fin Constructor
	/* CONSTRUCTOR */
	
	//Atiende el socket. Todo lo que llega lo mete en la charla.
	public void run()
	{
		try
		{
			while ( true )
			{
				String texto = dataInput.readUTF();
				synchronized (charla)
				{
					charla.addElement(texto);
					/* MOSTRAR MENSAJE */
					System.out.println(texto);
				}
			}
		}//Fin del bloque try

		//Procesar problemas con E/S
		catch ( Exception excepcion ) {
			excepcion.printStackTrace();
		}
	}//Fin Run
	
	//Envia el ultimo texto de la charla por el socket (ECO).	
	public void intervalAdded(ListDataEvent e) {
		String texto = charla.getElementAt(e.getIndex0());
        try
        {
            dataOutput.writeUTF(texto);
        } 
        catch (Exception excepcion)
        {
            excepcion.printStackTrace();
        }
	}

	@Override
	public void contentsChanged(ListDataEvent e) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void intervalRemoved(ListDataEvent e) {
		// TODO Auto-generated method stub
		
	}

	
	public Socket getSocket() {
		return socket;
	}

	
	public void setSocket(Socket socket) {
		this.socket = socket;
	}
}
